\chapter{命令文法の叙述の方法}
\indy{めいれいふんほう}{命令文法}とは、命令を竜に教えるために使う文法規則です。

\section{基本}
\index[wordindex]{きほん@基本!めいれいふんほうの ---@命令文法の ---}
Dragon Script の命令は1つづつ全文を示すことで竜に教えます。竜はそれに一致する
命令が来た時、教えた命令である、と認識します。つまり、以下の特殊記号を何も含まない
場合、全文に完全一致する命令のみを教えることになります。例えば、
\begin{lstlisting}
丸々同じ文でしか実行できません
\end{lstlisting}
という命令を定義した場合、
\begin{lstlisting}
丸々同じ文でしか実行できません。
\end{lstlisting}
という命令でしか実行できません。以下の特殊記号を含ませることで柔軟な命令体系を
創り出します。

\section{省略}
\indy{しょうりゃく}{省略}とは、命令の一部が省略できる時、つまり省略しても
意味を損なわない時や、意図的に引数を省略できるようにする時などに使います。

省略を使う時は、省略する部分を {\tt ()} ({\tt 0028}、{\tt 0029})で
括ります。省略ではなく単に {\tt ()} に一致させたい時は {\tt \textbackslash}
を使ってエスケープしてください。

\subsection*{例}
意味を損なわない例:
\begin{lstlisting}
XにYを加算(する)。
\end{lstlisting}
\begin{equation*}
\downarrow
\end{equation*}
\begin{lstlisting}
XにYを加算。
XにYを加算する。
\end{lstlisting}
に一致する。

省略時に特定の変数を処理の対象とする例:
\begin{lstlisting}
(Xを)(Yに)加える。
Xは数値で、省略された時はそれの1番目。
Yは数値で、省略された時はそれの2番目。
\end{lstlisting}

{\tt ()} に一致させる例:
\begin{lstlisting}
sin\(X\)。
Xは数値。
\end{lstlisting}

\section{選択}
\indy{せんたく}{選択}とは、命令の一部を複数の候補の中から1つを選択するような
場合に使います。どれを取っても意味を損なわない場合に使い、具体的には動詞の活用
などで多用されます。

選択は、選択の候補となる部分全体を {\tt []} ({\tt 005B}、{\tt 005D}) で括り、
選択の候補は {\tt /} ({\tt 005C}) で区切ってください。項目内に {\tt ]} や\ 
{\tt /} を含める時、項目外で {\tt []} を使う時はエスケープが必要です。

\subsection*{例}
動詞の活用での例:
\begin{lstlisting}
メッセージと言[う/います/え/おう]。
\end{lstlisting}
\begin{equation*}
\downarrow
\end{equation*}
\begin{lstlisting}
メッセージと言う。
メッセージと言います。
メッセージと言え。
メッセージと言おう。
\end{lstlisting}
に一致する。

\section{交換}
世の中には大して語順を気にしない言語が存在します。それらに便利なものがこの
\indy{こうかん}{交換}です。語順以外でも活用できる場面はあるでしょう。

交換は、交換の対象となる部分を {\tt \{\}} ({\tt 007B}、{\tt 007D})で
括ります。括った項目はすべて自由な順序で命令とすることができます。
2つ括った場合、2通りの命令を同時に教えることができます。4 つ 5 つ括るまで
ならなんとか手作業で全ての命令を定義できるかもしれませんが、6 つ括ると
720 通り、7 つ括ると 5040 通りにもなりますし、竜にとって高負荷となってし
まいます。さて、交換では交換先を指定することもできます。そのために
「\index[wordindex]{かき@鍵!めいれいふんほうこうかんの@命令文法交換の ---}鍵」
を使います。鍵は {\tt \{} と命令文との間に {\tt \textbar}\ ({\tt 007C})を
用いて区切り、そこに記すことで鍵となります。交換は鍵が同じ物同士が交換する
ことができます。同じ鍵のものがない場合は交換はなかったものとして扱われます。
交換対象となる文内で {\tt \textbar} を使う場合や交換の外で {\tt \{\}} を
使う場合にはエスケープする必要があります。

\subsection*{例}
\begin{lstlisting}
{Aに}{Bを}加える。
\end{lstlisting}
\begin{equation*}
\downarrow
\end{equation*}
\begin{lstlisting}
AにBを加える。
BをAに加える。
\end{lstlisting}
に一致する。

\begin{lstlisting}
[{A|Sを}{A|Aから(の範囲で)}{A|Bまで(の範囲で)}
	/{B|Sの(を)}{B|Aから(の範囲で)}{B|Bまで(の範囲で)}]切り取る
\end{lstlisting}
\begin{equation*}
\downarrow
\end{equation*}
\begin{lstlisting}
SをAからBまでの範囲で切り取る。
SのAからBまでの範囲で切り取る。
SのAからBまでの範囲で切り取る。
AからBまでSを切り取る。
AからBまでSのを切り取る。
\end{lstlisting}
などに一致する。{\tt A} と {\tt B} がそれぞれ鍵となります。

\section{任意}
選択では列挙できないほどたくさんのパターンがあった場合には竜に負荷を掛けることに
なります。そのため、考えられるパターンを越えた有りとあらゆる任意の文字列、つまり、
どんな文字列が来ても竜がその命令をしたと認めてくれます。ただし、引数となる部分の
隣では境界を区別できなくなる恐れがあるため、使えません。

\indy{にんいもしれつ}{任意文字列}を使うには記号 {\tt *} ({\tt 002A}) を使います。
{\tt *} に一致する命令を定義する場合はエスケープしてください。

\subsection*{例}
\begin{lstlisting}
メッセージと言[う/わ/い/え/お]*
\end{lstlisting}
\begin{equation*}
\downarrow
\end{equation*}
\begin{lstlisting}
メッセージと言う。
メッセージと言え。
メッセージと言いなさい。
メッセージと言わないと怒るわよ。
\end{lstlisting}
などに一致する。

\section{繰り返し}
一定のフレーズが繰り返し来てもよい場合に用います。利用すると思われるべき場所は
かなり限られますが、全く不必要と言うわけではありません。引数が含まれる場合、
その引数は例え1つであっても配列となって渡されます。

\indy{くりかえし}{繰り返し}を使うには、繰り返す部分を {\tt <} ({\tt 003C}) と\ 
{\tt >} ({\tt 003E})で挟みます。それぞれの文字を使いたい場合はエスケープが必要です。
なお、この繰り返しでは 1 回以上は出現しないと一致した命令と見なしません。0 回以上にする
には
\begin{lstlisting}
(<繰り返す内容>)
\end{lstlisting}
のように全体を {\tt ()} で括ります。

\subsection*{例}
\begin{lstlisting}
もしAならばB(<そうではなくCならばD>)違えばE
\end{lstlisting}
\begin{equation*}
\downarrow
\end{equation*}
\begin{lstlisting}
もしAならばB違えばE
もしAならばBそうではなくCならばD違えばE
もしAならばBそうではなくCならばDそうではなくCならばD違えばE
\end{lstlisting}
などに一致する。

\section{単語区切り}
命令叙述文をスペース ({\tt 0020}) で区切るとそこは\indy{たんこくきり}{単語区切り}
と見なされます。これがある時、竜は空の文字または表\ref{word_splitter}ある文字全てに一致
させようとします。必ず単語区切り文字を必要としたい場合はスペースの代わりに {\tt ,}\ 
({\tt 002C}) を使ってください。

\subsection*{例}
わかりやすいよう、スペースを表示しています。
\begin{lstlisting}[showspaces=true]
{Sを }{Aから (の範囲で,)}{Bまで (の範囲で,)} 切り取る
\end{lstlisting}
\begin{equation*}
\downarrow
\end{equation*}
\begin{lstlisting}
Sを、Aから、Bまで切り取る。
SをAからBまでの範囲で、切り取る。
SをAからBまでの範囲で、切り取る。
\end{lstlisting}
などには一致するが、
\begin{lstlisting}
SをAからBまでの範囲で切り取る。
\end{lstlisting}
などには一致しない。